home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / include / dev / RCS / pdev.h,v < prev    next >
Text File  |  1991-11-17  |  29KB  |  1,047 lines

  1. head     1.17;
  2. branch   ;
  3. access   ;
  4. symbols  sprited:1.17.1;
  5. locks    ; strict;
  6. comment  @ * @;
  7.  
  8.  
  9. 1.17
  10. date     89.06.15.12.15.06;  author brent;  state Exp;
  11. branches 1.17.1.1;
  12. next     1.16;
  13.  
  14. 1.16
  15. date     89.06.15.11.29.56;  author brent;  state Exp;
  16. branches ;
  17. next     1.15;
  18.  
  19. 1.15
  20. date     89.06.02.13.36.11;  author brent;  state Exp;
  21. branches ;
  22. next     1.14;
  23.  
  24. 1.14
  25. date     89.03.13.08.58.35;  author brent;  state Exp;
  26. branches ;
  27. next     1.13;
  28.  
  29. 1.13
  30. date     89.01.27.09.33.56;  author brent;  state Exp;
  31. branches ;
  32. next     1.12;
  33.  
  34. 1.12
  35. date     89.01.19.09.35.14;  author brent;  state Exp;
  36. branches ;
  37. next     1.11;
  38.  
  39. 1.11
  40. date     88.11.17.09.03.52;  author brent;  state Exp;
  41. branches ;
  42. next     1.10;
  43.  
  44. 1.10
  45. date     88.10.19.16.04.38;  author brent;  state Exp;
  46. branches ;
  47. next     1.9;
  48.  
  49. 1.9
  50. date     88.10.19.14.25.06;  author brent;  state Exp;
  51. branches ;
  52. next     1.8;
  53.  
  54. 1.8
  55. date     88.10.19.14.12.53;  author brent;  state Exp;
  56. branches ;
  57. next     1.7;
  58.  
  59. 1.7
  60. date     88.10.18.13.52.30;  author brent;  state Exp;
  61. branches ;
  62. next     1.6;
  63.  
  64. 1.6
  65. date     88.10.16.13.21.13;  author brent;  state Exp;
  66. branches ;
  67. next     1.5;
  68.  
  69. 1.5
  70. date     88.10.14.10.30.23;  author brent;  state Exp;
  71. branches ;
  72. next     1.4;
  73.  
  74. 1.4
  75. date     88.10.13.17.24.23;  author brent;  state Exp;
  76. branches ;
  77. next     1.3;
  78.  
  79. 1.3
  80. date     88.10.10.12.17.28;  author brent;  state Exp;
  81. branches ;
  82. next     1.2;
  83.  
  84. 1.2
  85. date     88.08.26.15.38.27;  author brent;  state Exp;
  86. branches ;
  87. next     1.1;
  88.  
  89. 1.1
  90. date     88.06.21.12.07.45;  author ouster;  state Exp;
  91. branches ;
  92. next     ;
  93.  
  94. 1.17.1.1
  95. date     91.11.17.18.30.20;  author kupfer;  state Exp;
  96. branches ;
  97. next     ;
  98.  
  99.  
  100. desc
  101. @@
  102.  
  103.  
  104. 1.17
  105. log
  106. @Fixed includes
  107. @
  108. text
  109. @/*
  110.  * pdev.h --
  111.  *
  112.  *    Declarations of the kernel/user-level-server interface for
  113.  *    pseudo-devices. A pseudo-device is a file
  114.  *    whose semantics are implemented by a user-level server process.
  115.  *    All other processes act on the file normally.  Their operations
  116.  *    on the file are mapped by the kernel into a request-response
  117.  *    exchange with the server process.  The types and constants defined
  118.  *    here are needed by the server programs to implement their
  119.  *    half of the pseudo-device protocol.  As well as implement the
  120.  *    regular file operations, Fs_Read, Fs_Write, and Fs_IOControl,
  121.  *    the server is involved in open/close time actions, and the
  122.  *    server helps control the select state of the pseudo device.
  123.  *    
  124.  *    A more complete explaination of pseudo-devices should be in
  125.  *    the man page (/sprite/doc/ref/devices/pdev), but the following
  126.  *    brief explaination may help.  The interface between the kernel
  127.  *    and the server process is based on filesystem streams.  The
  128.  *    server gets a "control stream" when it opens the pseudo-device
  129.  *    file with the FS_MASTER flag.  This control stream is readable
  130.  *    when a new client process has opened the pseudo-device.  The
  131.  *    control stream contains a short message with a new filesystem
  132.  *    streamID for a "service stream" that the server uses to communicate
  133.  *    with the new client.
  134.  *    Service streams are used by the server to get request messages
  135.  *    (that correspond to client operations) and return results.
  136.  *
  137.  *    Associated with each service stream is a "request buffer".  The server
  138.  *    gets request messages from clients indirectly; the requests are
  139.  *    placed into the request buffer, along with their data, and the server
  140.  *    learns about new requests by reading messages from the service stream
  141.  *    that contain 'firstByte' and 'lastByte' offsets into the request buffer.
  142.  *    This buffered interface lets the kernel stack up many requests (writes,
  143.  *    in particular) before a    context switch is required to the server
  144.  *    program.  Of course, this also lets the server handle all the queued
  145.  *    requests at one time.  When the    server has handled requests it updates
  146.  *    the 'firstByte' pointer by making a IOC_PDEV_SET_PTRS ioctl() on
  147.  *    the service stream.
  148.  *
  149.  *    There can also be a read ahead buffer associated with each service
  150.  *    stream.  This is filled with data by the server program that is to
  151.  *    be read by a client, and the kernel moves data from this buffer,
  152.  *    which is again in the server's address space, to the client without
  153.  *    having to switch out to the server process. 
  154.  *    
  155.  * Copyright 1987 Regents of the University of California
  156.  * All rights reserved.
  157.  * Permission to use, copy, modify, and distribute this
  158.  * software and its documentation for any purpose and without
  159.  * fee is hereby granted, provided that the above copyright
  160.  * notice appear in all copies.  The University of California
  161.  * makes no representations about the suitability of this
  162.  * software for any purpose.  It is provided "as is" without
  163.  * express or implied warranty.
  164.  *
  165.  *
  166.  * $Header: /sprite/src/lib/include/dev/RCS/pdev.h,v 1.16 89/06/15 11:29:56 brent Exp Locker: brent $ SPRITE (Berkeley)
  167.  */
  168.  
  169. #ifndef _PDEV
  170. #define _PDEV
  171.  
  172. #include "proc.h"
  173. #ifdef KERNEL
  174. #include "fs.h"
  175. #else
  176. #include <kernel/fs.h>
  177. #endif
  178.  
  179. /*
  180.  * Pseudo-device operations
  181.  *    PDEV_OPEN        The first request after a client open.
  182.  *    PDEV_DUP        OBSOLETE, but might resurrect itself.
  183.  *    PDEV_CLOSE        The last request.
  184.  *    PDEV_READ        Read data from the pseudo-device.
  185.  *    PDEV_WRITE        Write data to the pseudo-device.
  186.  *    PDEV_IOCTL        Special operation on the pseudo-device.
  187.  *    PDEV_WRITE_ASYNC    Asynchronous write.  No reply needed.
  188.  *
  189.  * These two only apply to pseudo-device connections to pseudo-file-systems.
  190.  * For regular pseudo-devices the kernel takes care of attribute handling.
  191.  *    PDEV_GET_ATTR        Get attributes given a pdev connection.
  192.  *    PDEV_SET_ATTR        Set attributes given a pdev connection.
  193.  */
  194.  
  195. typedef int Pdev_Op;
  196.  
  197. #define PDEV_OPEN        1
  198. /* #define PDEV_DUP        2 */
  199. #define PDEV_CLOSE        3
  200. #define PDEV_READ        4
  201. #define PDEV_WRITE        5
  202. #define PDEV_IOCTL        6
  203. #define PDEV_WRITE_ASYNC    7
  204. #define PDEV_GET_ATTR        8
  205. #define PDEV_SET_ATTR        9
  206.  
  207. /*
  208.  * A pseudo-device server gets a 'control stream' when opening a pseudo-device.
  209.  * The following structure describes the messages read from the control stream.
  210.  * Control stream messages are used to notify the server that it
  211.  * has a new private stream because a client opened the pseudo-device.
  212.  */
  213. typedef struct Pdev_Notify {
  214.     unsigned int    magic;            /* == PDEV_NOTIFY_MAGIC */
  215.     int            newStreamID;
  216.     int            reserved;        /* Extra */
  217. } Pdev_Notify;
  218.  
  219. #define PDEV_NOTIFY_MAGIC    0x1D4E4F52
  220.  
  221. /*
  222.  * The first message on a private stream is a PDEV_OPEN.
  223.  * This message identifies the client process, its host, and the host's
  224.  * byte order to the server.
  225.  */
  226.  
  227. typedef struct Pdev_OpenParam {
  228.     int flags;            /* Flags from the Fs_Open call */
  229.     Proc_PID pid;        /* Client's process ID */
  230.     int hostID;            /* Host ID where client is from */
  231.     int uid;            /* User ID of the client process */
  232.     int gid;            /* Group ID of the client process */
  233.     int byteOrder;        /* Byte order identifier */
  234.     int reserved;        /* Extra */
  235. } Pdev_OpenParam;
  236.  
  237. /*
  238.  * PDEV_READ, PDEV_WRITE request parameters, see <kernel/fsIO.h>
  239.  */
  240.  
  241. typedef Fs_IOParam Pdev_RWParam;
  242.  
  243. /*
  244.  * PDEV_IOCTL request parameter, see <kernel/fsIO.h>
  245.  */
  246.  
  247. typedef Fs_IOCParam Pdev_IOCParam;
  248.  
  249. /*
  250.  * PDEV_SET_ATTR request parameters.  These are in the Pdev_Request header,
  251.  * and the new Fs_Attributes record is passed as the data block following
  252.  * the header.  The user and group ID are used for authentication.
  253.  */
  254.  
  255. typedef struct {
  256.     int        flags;        /* Which attributes to set */
  257.     int        uid;        /* User ID */
  258.     int        gid;        /* Group ID */
  259. } Pdev_SetAttrParam;
  260.  
  261.  
  262. /*
  263.  * When a client does something to the pseudo-device the server gets
  264.  * a corresponding request message.  The structure of it is defined here.
  265.  * The control information in the request header is the same for both
  266.  * pseudo-device and pseudo-filesystem operations.
  267.  */
  268.  
  269. typedef struct {
  270.     unsigned int magic;        /* PDEV_REQUEST_MAGIC or PFS_REQUEST_MAGIC */
  271.     Pdev_Op    operation;    /* What action is requested. */
  272.     int        messageSize;    /* The complete size of the request header
  273.                  * plus data, plus padding for alignment */
  274.     int        requestSize;    /* Size of data following this header */
  275.     int        replySize;    /* Max size of the reply data expected. */
  276.     int        dataOffset;    /* Offset of data from start of header */
  277. } Pdev_RequestHdr;
  278.  
  279. typedef struct {
  280.     Pdev_RequestHdr    hdr;    /* with PDEV_REQUEST_MAGIC */
  281.     union {            /* Additional parameters to the operation. */
  282.     Pdev_OpenParam        open;
  283.     Pdev_RWParam        read;
  284.     Pdev_RWParam        write;
  285.     Pdev_IOCParam        ioctl;
  286.     Pdev_SetAttrParam    setAttr;
  287.     } param;
  288. } Pdev_Request;
  289.  
  290. #define PDEV_REQUEST_MAGIC    0x7265717E
  291.  
  292. /*
  293.  * IOC_PDEV_REPLY is used to return the following information about
  294.  * a reply to a client's request.  The status in
  295.  * the reply header will be the return value of the client's system call,
  296.  * except for FS_WOULD_BLOCK and FS_LOOKUP_REDIRECT which are processed
  297.  * by the kernel.
  298.  */
  299.  
  300. typedef struct Pdev_Reply {
  301.     unsigned int magic;        /* PDEV_REPLY_MAGIC */
  302.     ReturnStatus status;    /* Return status of remote call */
  303.     int        selectBits;    /* Return select state bits */
  304.     int        replySize;    /* Size of the data in replyBuf, if any */
  305.     Address    replyBuf;    /* Server space address of reply data */
  306.     int        signal;        /* Signal to return, if non-zero */
  307.     int        code;        /* Code to modify signal */
  308. } Pdev_Reply;
  309.  
  310. #define PDEV_REPLY_MAGIC    0x52455057
  311.  
  312. /*
  313.  * IOC_PDEV_SMALL_REPLY uses the following struct to return a small
  314.  * amount of data to the client's request.
  315.  * Up to PDEV_SMALL_DATA_LIMIT bytes can be returned.
  316.  * 
  317.  */
  318. #define PDEV_SMALL_DATA_LIMIT    16
  319.  
  320. typedef struct Pdev_ReplyData {
  321.     unsigned int magic;        /* PDEV_REPLY_DATA_MAGIC */
  322.     ReturnStatus status;    /* Return status of remote call */
  323.     int        selectBits;    /* Return select state bits */
  324.     int        replySize;    /* Size of following data */
  325.     Address    replyBuf;    /* Unused, needed for padding & compatibility */
  326.     int        signal;        /* (non-zero) Signal to generate, if any */
  327.     int        code;        /* Code to modify the signal */
  328.     char    data[PDEV_SMALL_DATA_LIMIT];    /* Reply data */
  329. } Pdev_ReplyData;
  330.  
  331. #define PDEV_REPLY_DATA_MAGIC    0x524ABC57
  332.  
  333. /*
  334.  * I/O Controls for server streams.
  335.  *    IOC_PDEV_READY        The server uses this to notify the kernel
  336.  *                that the pseudo-device is ready for I/O now.
  337.  *                The input buffer should contain an int
  338.  *                with an or'd combination of FS_READABLE,
  339.  *                FS_WRITABLE, or FS_EXCEPTION.
  340.  *    IOC_PDEV_SET_BUF    These are used to tell the kernel where the
  341.  *                request buffer and read ahead buffer (if any)
  342.  *                are. The input buffer should contain a
  343.  *                Pdev_SetBufArgs struct.  Note that this
  344.  *                needs to be done after getting a notification
  345.  *                on the control stream before any request
  346.  *                (i.e. the client's open request) comes through.
  347.  *                This can also be done later to change the
  348.  *                buffer if needed.  The buffer change takes
  349.  *                place as soon as the previous one empties.
  350.  *                The switch is indicated by the requestAddr
  351.  *                that you read from the service stream.
  352.  *    IOC_PDEV_WRITE_BEHIND    Set (Unset) write-behind buffering in the
  353.  *                request buffer.  The single input argument
  354.  *                is a pointer to a Boolean; TRUE enables
  355.  *                write-behind, FALSE inhibits it.  The default
  356.  *                is no write-behind.
  357.  *    IOC_PDEV_SET_PTRS    These are used to update the firstByte and
  358.  *                lastByte pointers into the request and
  359.  *                read ahead buffers.  The input buffer
  360.  *                is a Pdev_BufPtrs structure.
  361.  *    IOC_PDEV_REPLY        This is used to send a reply to a request.
  362.  *                The input buffer contains a Pdev_Reply.  This
  363.  *                includes an address (in the server's space)
  364.  *                of a buffer containing reply data, if any.
  365.  *    IOC_PDEV_SMALL_REPLY    This is like IOC_PDEV_REPLY, except that
  366.  *                the reply data is embedding in the struct
  367.  *                passed into the kernel.  The amount of data
  368.  *                that can be returned this was is defined
  369.  *                by PDEV_SMALL_DATA_LIMIT.
  370.  *    IOC_PDEV_BIG_WRITES    Set (Unset) the ability of the client to
  371.  *                write a chunk larger than will fit into
  372.  *                the request buffer.  This is to support
  373.  *                UDP socket semantics that prevent a client
  374.  *                from writing more than the declared packet size.
  375.  *                (Of course, we could do better by keeping the
  376.  *                 existing semantics that automatically break
  377.  *                 the write into smaller ones...)
  378.  *                The input buffer should reference a Boolean;
  379.  *                TRUE enables big writes (which is the default)
  380.  *                FALSE prevents big writes.
  381.  *    IOC_PDEV_SIGNAL_OWNER    This sends a signal to the controlling process
  382.  *                of the pseudo-device.  If there is no owner
  383.  *                then this is ignored.  The input buffer contains
  384.  *                the signal number and code to send.
  385.  *
  386.  */
  387.  
  388. #define IOC_PDEV        (2 << 16)
  389. #define IOC_PDEV_READY        (IOC_PDEV | 0x1)
  390. #define IOC_PDEV_SET_BUF    (IOC_PDEV | 0x2)
  391. #define IOC_PDEV_WRITE_BEHIND    (IOC_PDEV | 0x3)
  392. #define IOC_PDEV_SET_PTRS    (IOC_PDEV | 0x4)
  393. #define IOC_PDEV_REPLY        (IOC_PDEV | 0x5)
  394. #define IOC_PDEV_BIG_WRITES    (IOC_PDEV | 0x6)
  395. #define IOC_PDEV_SIGNAL_OWNER    (IOC_PDEV | 0x7)
  396. #define IOC_PDEV_SMALL_REPLY    (IOC_PDEV | 0x8)
  397.  
  398. /*
  399.  * Input structure for the IOC_PDEV_SET_BUF IOControl
  400.  */
  401.  
  402. typedef struct Pdev_SetBufArgs {
  403.     Address    requestBufAddr;        /* Server's address of request buffer */
  404.     int        requestBufSize;        /* Num bytes in the request buffer */
  405.     Address    readBufAddr;        /* NULL if no read ahead.  Non-NULL
  406.                      * implicitly enables read-ahead. */
  407.     int        readBufSize;        /* Num bytes in the read ahead buffer */
  408. } Pdev_SetBufArgs;
  409.  
  410. /*
  411.  * Input structure for IOC_PDEV_SET_PTRS IOControl.
  412.  */
  413.  
  414. typedef struct Pdev_BufPtrs {
  415.     int magic;            /* == PDEV_BUF_PTR_MAGIC */
  416.     Address    requestAddr;    /* The address of the request buffer.  This is
  417.                  * valid when reading only, and it indicates
  418.                  * what request buffer is being used.  See
  419.                  * IOC_PDEV_SET_BUF. */
  420.     int requestFirstByte;    /* Byte offset of the first valid data byte
  421.                  * in the request buffer.  If -1 buf is empty */
  422.     int requestLastByte;    /* Byte offset of the last valid data byte. */
  423.     int readFirstByte;        /* Byte offset of the first valid data byte
  424.                  * in the read ahead buffer. -1 => empty */
  425.     int readLastByte;        /* Byte offset of the last data byte. */
  426. } Pdev_BufPtrs;
  427.  
  428. #define PDEV_BUF_PTR_MAGIC    0x3C46DF14
  429.  
  430. /*
  431.  * Stucture for the IOC_PDEV_SIGNAL_OWNER operation.
  432.  */
  433. typedef struct Pdev_Signal {
  434.     unsigned int signal;
  435.     unsigned int code;
  436. } Pdev_Signal;
  437.  
  438. #endif _PDEV
  439. @
  440.  
  441.  
  442. 1.17.1.1
  443. log
  444. @Initial branch for Sprite server.
  445. @
  446. text
  447. @d58 1
  448. a58 1
  449.  * $Header: /sprite/src/lib/include/dev/RCS/pdev.h,v 1.17 89/06/15 12:15:06 brent Exp $ SPRITE (Berkeley)
  450. @
  451.  
  452.  
  453. 1.16
  454. log
  455. @Nuked use of fsIO.h
  456. @
  457. text
  458. @d58 1
  459. a58 1
  460.  * $Header: /sprite/src/lib/include/dev/RCS/pdev.h,v 1.15 89/06/02 13:36:11 brent Exp Locker: brent $ SPRITE (Berkeley)
  461. d65 1
  462. d67 3
  463. @
  464.  
  465.  
  466. 1.15
  467. log
  468. @New interface that includes signals and expanded parameter blocks
  469. @
  470. text
  471. @d58 1
  472. a58 1
  473.  * $Header: /sprite/src/lib/include/dev/RCS/pdev.h,v 1.14 89/03/13 08:58:35 brent Exp Locker: brent $ SPRITE (Berkeley)
  474. a65 5
  475. #ifdef KERNEL
  476. #include "fsIO.h"
  477. #else
  478. #include <kernel/fsIO.h>
  479. #endif
  480. @
  481.  
  482.  
  483. 1.14
  484. log
  485. @Added IOC_PDEV_SIGNAL_OWNER constant
  486. @
  487. text
  488. @d58 1
  489. a58 1
  490.  * $Header: /sprite/src/lib/include/dev/RCS/pdev.h,v 1.13 89/01/27 09:33:56 brent Exp $ SPRITE (Berkeley)
  491. d66 5
  492. d112 1
  493. a112 1
  494. #define PDEV_NOTIFY_MAGIC    0x1D4E4F54
  495. d125 1
  496. d131 1
  497. a131 3
  498.  * PDEV_READ, PDEV_WRITE request parameters. 
  499.  *    There is a reply block for read, the data.  There is no
  500.  *    reply data for a write.
  501. d134 1
  502. a134 8
  503. typedef struct {
  504.     int        offset;        /* Byte offset for the transfer, the length of
  505.                  * the transfer is implied by the sizes in the
  506.                  * Request header. */
  507.     unsigned int familyID;    /* Can be used to enforce controlling tty */
  508.     Proc_PID    procID;        /* Needed for signalling, etc. */
  509.     int        reserved;    /* Extra */
  510. } Pdev_RWParam;
  511. d137 1
  512. a137 1
  513.  * PDEV_IOCTL request parameter.
  514. d140 1
  515. a140 8
  516. typedef struct {
  517.     int        command;    /* I/O control command #. */
  518.     unsigned int familyID;    /* Can be used to enforce controlling tty */
  519.     Proc_PID    procID;        /* Process id of calling process */
  520.     int        byteOrder;    /* Defines caller's byte order.  Needed
  521.                  * to correctly interpret following data. */
  522.     int        reserved;    /* Extra */
  523. } Pdev_IOCParam;
  524. d145 1
  525. a145 1
  526.  * the header.
  527. d183 1
  528. a183 1
  529. #define PDEV_REQUEST_MAGIC    0x7265717D
  530. d186 2
  531. a187 2
  532.  * The server replies to each message on the private stream with
  533.  * a reply header followed with reply data (if any).  The status in
  534. d194 1
  535. a194 1
  536.     unsigned int magic;        /* == PDEV_REPLY_MAGIC */
  537. d199 2
  538. a200 1
  539.     int        reserved;    /* Extra */
  540. d203 22
  541. a224 1
  542. #define PDEV_REPLY_MAGIC    0x52455058
  543. d258 5
  544. d289 1
  545. @
  546.  
  547.  
  548. 1.13
  549. log
  550. @Added IOC_PDEV_SIGNAL
  551. @
  552. text
  553. @d58 1
  554. a58 1
  555.  * $Header: /sprite/src/lib/include/dev/RCS/pdev.h,v 1.12 89/01/19 09:35:14 brent Exp Locker: brent $ SPRITE (Berkeley)
  556. d271 1
  557. @
  558.  
  559.  
  560. 1.12
  561. log
  562. @Removed pseudo-file-system definitions to their own file
  563. @
  564. text
  565. @d58 1
  566. a58 1
  567.  * $Header: /sprite/src/lib/include/dev/RCS/pdev.h,v 1.11 88/11/17 09:03:52 brent Exp Locker: brent $ SPRITE (Berkeley)
  568. d257 4
  569. d303 8
  570. @
  571.  
  572.  
  573. 1.11
  574. log
  575. @Added rename parameters
  576. @
  577. text
  578. @d5 1
  579. a5 1
  580.  *    pseudoo-devices and pseudo-filesystems. A pseudo-device is a file
  581. a15 4
  582.  *    Pseudo-filesystem servers handle naming requests over the same
  583.  *    kind of communication channel that pseudo-device servers handle
  584.  *    I/O requests.
  585.  *
  586. d30 1
  587. a30 1
  588.  *    learns of new requests from clients indirectly; the requests are
  589. d44 2
  590. a45 1
  591.  *    which is again in the server's address space, to the client's buffer. 
  592. d49 7
  593. d58 1
  594. a58 1
  595.  * $Header: /sprite/src/lib/include.new/dev/RCS/pdev.h,v 1.10 88/10/19 16:04:38 brent Exp $ SPRITE (Berkeley)
  596. a66 6
  597. #ifdef KERNEL
  598. #include "fsNameOps.h"
  599. #else
  600. #include <kernel/fsNameOps.h>
  601. #endif
  602.  
  603. a67 12
  604.  * Type of operation requested by a client.  There are two mutually exclusize
  605.  *    command groups, those for pseudo-devices, and those for
  606.  *    pseudo-filesystems.  The pseduo-device commands are used to open
  607.  *    a connection to a pseudo-device, and then to forward I/O operations
  608.  *    to the pseudo-device server.  The pseudo-filesystem commands are used
  609.  *    forward naming operations from the kernel to the pseudo-filesystem
  610.  *    server.  These are kept distinct, instead of overlapping,
  611.  *    for consistency checking.  Note that there are two variants of the
  612.  *    command request header, Pdev_Request vs. Pfs_Request.  These are
  613.  *    slightly different because of differences in command parameters.
  614.  *    (Typedefs below are used to marshal parameters to these calls.)
  615.  *
  616. a68 1
  617.  *    PDEV_INVALID        Not used
  618. d75 4
  619. a80 11
  620.  *
  621.  * Pseudo-filesystem pathname operations
  622.  *    PFS_OPEN        Open a file in the pseudo-filesystem.
  623.  *    PFS_GET_ATTR        Get attributes given a pathname in a pfs.
  624.  *    PFS_SET_ATTR        Set attributes given a pathname in a pfs.
  625.  *    PFS_MAKE_DEVICE        Make a device
  626.  *    PFS_MAKE_DIR        Make a directory
  627.  *    PFS_REMOVE        Remove a file
  628.  *    PFS_REMOVE_DIR        Remove a directory
  629.  *    PFS_RENAME        Rename a file
  630.  *    PFS_HARD_LINK        Make a hard link between two files.
  631. d83 1
  632. a83 20
  633. typedef enum {
  634.     PDEV_INVALID,
  635.     PDEV_OPEN,
  636.     PDEV_DUP,
  637.     PDEV_CLOSE,
  638.     PDEV_READ,
  639.     PDEV_WRITE,
  640.     PDEV_IOCTL,
  641.     PDEV_GET_ATTR,        /* For Fs_GetAttributesID */
  642.     PDEV_SET_ATTR,
  643.     PFS_OPEN,
  644.     PFS_GET_ATTR,        /* For Fs_GetAttributes */
  645.     PFS_SET_ATTR,
  646.     PFS_MAKE_DEVICE,
  647.     PFS_MAKE_DIR,
  648.     PFS_REMOVE,
  649.     PFS_REMOVE_DIR,
  650.     PFS_RENAME,
  651.     PFS_HARD_LINK,
  652. } Pdev_Op;
  653. d85 9
  654. a93 1
  655. #define PDEV_NUM_OPS    18
  656. d111 2
  657. a112 2
  658.  * This message provides a unique ID for the client and
  659.  * provides some other IDs for use by the server.
  660. d153 1
  661. a153 1
  662.  * PDEV_SET_ATTR request parameters.  These are in the Pfs_Request header,
  663. d164 1
  664. d168 1
  665. a168 1
  666.  * The control information in the command header is the same for both
  667. d173 1
  668. a173 1
  669.     unsigned int magic;        /* PDEV_REQUEST_MAGIC|PFS_REQUEST_MAGIC */
  670. a195 30
  671.  * When a naming operation is done in a pseudo-filesystem the pfs server
  672.  * gets a message of the following format.
  673.  */
  674.  
  675. typedef struct {
  676.     Pdev_RequestHdr    hdr;    /* with PFS_REQUEST_MAGIC */
  677.     union {            /* Additional parameters to the operation. */
  678.     FsOpenArgs        open;
  679.     FsLookupArgs        lookup;
  680.     FsMakeDeviceArgs    makeDevice;
  681.     Fs2PathParams        rename;
  682.     } param;
  683. } Pfs_Request;
  684.  
  685. #define PFS_REQUEST_MAGIC    0x73657C6A
  686.  
  687. /*
  688.  * When a PFS_SET_ATTR operation is done the data that follows the message hdr
  689.  * has the following format.  The file name comes at the end and its true
  690.  * length is given in one field.
  691.  */
  692.  
  693. typedef struct {
  694.     Fs_Attributes    attr;        /* Attribute values */
  695.     int            flags;        /* Indicates which attributes to set */
  696.     int            nameLength;    /* Number of bytes in name */
  697.     char        name[4];    /* Actually larger */
  698. } Pfs_SetAttrData;
  699.  
  700. /*
  701. d198 3
  702. a200 1
  703.  * the reply header will be the return value of the client's system call.
  704. a257 28
  705.  * I/O Controls specific to pseudo-filesystem servers
  706.  *    IOC_PFS_OPEN        This is used instead of IOC_PDEV_REPLY to
  707.  *                respond to a PFS_OPEN request.  This reply
  708.  *                causes a new pseudo-device connection between
  709.  *                the server and the opening client.  The result
  710.  *                of this I/O control is a new streamID for
  711.  *                the server's half of the connection.  Unlike
  712.  *                pseudo-device servers, there is no need to
  713.  *                read a control stream to get this streamID,
  714.  *                it is returned as a result of this IOC.
  715.  *    IOC_PFS_SET_ID        This is used to set the file ID associated
  716.  *                with a connection to a pseudo-filesystem server.
  717.  *                There will be a naming connection, and perhaps
  718.  *                many more pdev-like connections that represent
  719.  *                files.  The ID set by this call we be passed in
  720.  *                as the 'prefixID' and 'rootID' fields of
  721.  *                the arguments to naming operations.  If this
  722.  *                call is not used then the kernel's own
  723.  *                fileIDs (which are unique, anyway) are used.
  724.  *    IOC_PFS_PASS_STREAM    This is used instead of IOC_PDEV_REPLY to
  725.  *                respond to a PFS_OPEN request.  This reply
  726.  *                passes the stream indicated by the input
  727.  *                streamID to the client as the result of its
  728.  *                open request.  Thus the pseudo-filesystem
  729.  *                server can open a file/device/whatever on
  730.  *                behalf of its client and return the open file.
  731.  *                The pseudo-filesystem server won't see any
  732.  *                more I/O operations, or the close.
  733. a266 3
  734. #define IOC_PFS_OPEN        (IOC_PDEV | 0x7)
  735. #define IOC_PFS_SET_ID        (IOC_PDEV | 0x8)
  736. #define IOC_PFS_PASS_STREAM    (IOC_PDEV | 0x9)
  737. @
  738.  
  739.  
  740. 1.10
  741. log
  742. @Added gid to Pdev_SetAttrParam so pdev handler can check
  743. \both uid and gid before setting attributes.
  744. @
  745. text
  746. @d54 1
  747. a54 1
  748.  * $Header: /sprite/src/lib/include.new/dev/RCS/pdev.h,v 1.9 88/10/19 14:25:06 brent Exp $ SPRITE (Berkeley)
  749. d238 1
  750. @
  751.  
  752.  
  753. 1.9
  754. log
  755. @Moved extern for tracing variable to library header file.
  756. This file just have stuff for kernel/server interface.
  757. @
  758. text
  759. @d54 1
  760. a54 1
  761.  * $Header: /sprite/src/lib/include.new/dev/RCS/pdev.h,v 1.8 88/10/19 14:12:53 brent Exp Locker: brent $ SPRITE (Berkeley)
  762. d186 3
  763. a188 1
  764.  * PDEV_SET_ATTR request parameters.
  765. d194 1
  766. @
  767.  
  768.  
  769. 1.8
  770. log
  771. @Added pfsTraceNaming so clients of the library can have control
  772. over tracing.
  773. @
  774. text
  775. @d54 1
  776. a54 1
  777.  * $Header: /sprite/src/lib/include.new/dev/RCS/pdev.h,v 1.7 88/10/18 13:52:30 brent Exp Locker: brent $ SPRITE (Berkeley)
  778. a67 6
  779.  
  780. /*
  781.  * If pfsTraceNaming is set the lookup operations to a pseudo-filesystem
  782.  * server are logged to standard output.
  783.  */
  784. extern int pfsTraceNaming;
  785. @
  786.  
  787.  
  788. 1.7
  789. log
  790. @Added #define PDEV_NUM_OPS for use in the library.
  791. @
  792. text
  793. @d54 1
  794. a54 1
  795.  * $Header: /sprite/src/lib/include.new/dev/RCS/pdev.h,v 1.6 88/10/16 13:21:13 brent Exp $ SPRITE (Berkeley)
  796. d68 6
  797. @
  798.  
  799.  
  800. 1.6
  801. log
  802. @Added IOC_PFS_SET_ID which is used to set the fileID associated
  803. with a pseudo-filesystem connection.
  804. @
  805. text
  806. @d54 1
  807. a54 1
  808.  * $Header: /sprite/src/lib/include.new/dev/RCS/pdev.h,v 1.5 88/10/14 10:30:23 brent Exp Locker: brent $ SPRITE (Berkeley)
  809. d125 2
  810. @
  811.  
  812.  
  813. 1.5
  814. log
  815. @Updated includes.
  816. @
  817. text
  818. @d54 1
  819. a54 1
  820.  * $Header: pdev.h,v 1.4 88/10/13 17:24:23 brent Exp $ SPRITE (Berkeley)
  821. d322 9
  822. d338 2
  823. d350 2
  824. a351 1
  825. #define IOC_PFS_PASS_STREAM    (IOC_PDEV | 0x8)
  826. @
  827.  
  828.  
  829. 1.4
  830. log
  831. @Added IOControls for completing pseudo-filesystem opens.
  832. Added get/set attributes support
  833. @
  834. text
  835. @d54 1
  836. a54 1
  837.  * $Header: pdev.h,v 1.3 88/10/10 12:17:28 brent Exp $ SPRITE (Berkeley)
  838. d61 1
  839. d184 9
  840. d206 1
  841. a206 1
  842.     int        reserved;    /* Extra */
  843. d216 1
  844. d249 1
  845. a249 1
  846. } Pdev_SetAttrData;
  847. @
  848.  
  849.  
  850. 1.3
  851. log
  852. @Added request-response commands for pseudo-filesystems,
  853. and generalized message header so it can be used cleanly
  854. for both classes of commands.
  855. @
  856. text
  857. @d54 1
  858. a54 1
  859.  * $Header: pdev.h,v 1.2 88/08/26 15:38:27 brent Exp $ SPRITE (Berkeley)
  860. d89 2
  861. d92 1
  862. a92 1
  863.  * Pseudo-filesystem operations
  864. d94 2
  865. a95 2
  866.  *    PFS_GET_ATTR        Get the attributes of a file...
  867.  *    PFS_SET_ATTR        Set the attributes of a file...
  868. d112 2
  869. d115 1
  870. a115 1
  871.     PFS_GET_ATTR,
  872. d228 13
  873. d300 18
  874. d327 2
  875. @
  876.  
  877.  
  878. 1.2
  879. log
  880. @Cleaned up structures and added byteOrder parameter for PDEV_IOCTL
  881. @
  882. text
  883. @d4 2
  884. a5 1
  885.  *    Declarations for pseudo-devices.  A pseudo-device is a special file
  886. d15 4
  887. d54 1
  888. a54 1
  889.  * $Header: pdev.h,v 2.4 88/03/31 10:00:25 brent Exp $ SPRITE (Berkeley)
  890. d62 6
  891. d69 13
  892. a81 2
  893.  * Type of operation requested by a client.  (There are typedefs below
  894.  *    that are used to marshal parameters to these calls.)
  895. d88 12
  896. a99 1
  897.  *    PDEV_IOCTL        Special operation on the pseudo-device.    
  898. d110 9
  899. d122 1
  900. a122 1
  901.  * The server gets a 'control stream' back when opening the pseudo-device.
  902. d181 2
  903. d186 1
  904. a186 1
  905.     unsigned int magic;        /* == PDEV_REQUEST_MAGIC */
  906. d193 4
  907. d206 16
  908. @
  909.  
  910.  
  911. 1.1
  912. log
  913. @Initial revision
  914. @
  915. text
  916. @d23 1
  917. a23 1
  918.  *    streamID for a "server stream" that the server uses to communicate
  919. d25 1
  920. a25 1
  921.  *    These streams are used by the server to read request messages
  922. d28 11
  923. a38 10
  924.  *    The server learns of new requests from clients indirectly; the requests
  925.  *    are placed into a buffer, along with their data, and the server learns
  926.  *    about these additions by reading messages that contain 'firstByte'
  927.  *    and 'lastByte' offsets into the buffer.  This buffered interface lets
  928.  *    the kernel stack up many requests (writes, in particular) before a
  929.  *    context switch is required to the server program.  Of course, this also
  930.  *    lets the server handle all the queued requests at one time.  When the
  931.  *    server has handled requests it updates the 'firstByte' pointer by
  932.  *    making a IOC_PDEV_SET_PTRS IOControl on the private stream for the
  933.  *    client.
  934. d40 4
  935. a43 4
  936.  * There can also be a read ahead buffer for a pseudo-device.  This is
  937.  * filled with data by the server program that is to be read by the client,
  938.  * and the kernel moves data from this (server address space) buffer to
  939.  * the client's buffer. 
  940. d62 1
  941. a62 1
  942.  *    PDEV_DUP        OBSOLETE.
  943. d72 1
  944. a72 1
  945.     PDEV_DUP,            /* XXX going away, this is a placeholder */
  946. d86 1
  947. a86 1
  948.     unsigned int    magic;    /* == PDEV_NOTIFY_MAGIC */
  949. d88 1
  950. d104 2
  951. a105 1
  952.     int clientID;        /* Unique ID for the client. XXX for old junk */
  953. a107 6
  954. typedef struct Pdev_WaitInfo {    /* XXX for old stuff */
  955.     int hostID;
  956.     Proc_PID    pid;
  957.     int    token;
  958. } Pdev_WaitInfo;
  959.  
  960. d115 3
  961. a117 4
  962.     int offset;        /* Byte offset for the transfer, the length of
  963.              * the transfer is implied by the sizes in the
  964.              * Request header. */
  965.     Pdev_WaitInfo wait;    /* XXX */
  966. d119 2
  967. a122 8
  968. typedef struct {
  969.     int offset;        /* Byte offset for the transfer, the length of
  970.              * the transfer is implied by the sizes in the
  971.              * Request header. */
  972.     unsigned int familyID;    /* Can be used to enforce controlling tty */
  973.     Proc_PID procID;    /* Needed for signalling, etc. */
  974. } Pdev_NewRWParam;
  975.  
  976. d126 1
  977. d130 4
  978. a135 6
  979. typedef struct {
  980.     int        command;    /* I/O control command #. */
  981.     unsigned int familyID;    /* Can be used to enforce controlling tty */
  982.     Proc_PID procID;        /* Process id of calling process */
  983. } Pdev_NewIOCParam;
  984.  
  985. d144 5
  986. a148 3
  987.     int        requestSize;    /* Size of the request data that immediately
  988.                  * follows this request header. */
  989.     int        replySize;    /* Max size of the reply expected. */
  990. d157 1
  991. a157 14
  992. typedef struct {
  993.     unsigned int magic;        /* == PDEV_REQUEST_MAGIC */
  994.     Pdev_Op    operation;    /* What action is requested. */
  995.     int        messageSize;    /* The complete size of the request header
  996.                  * plus data, plus padding for alignment */
  997.     int        requestSize;    /* Size of data following this header */
  998.     int        replySize;    /* Max size of the reply data expected. */
  999.     union {            /* Additional parameters to the operation. */
  1000.     Pdev_OpenParam        open;
  1001.     Pdev_NewRWParam        read;
  1002.     Pdev_NewRWParam        write;
  1003.     Pdev_NewIOCParam    ioctl;
  1004.     } param;
  1005. } Pdev_NewRequest;
  1006. a158 2
  1007. #define PDEV_REQUEST_MAGIC    0x7265717C
  1008.  
  1009. d164 1
  1010. a168 7
  1011.     int        replySize;    /* Size of the data that follows, if any */
  1012. } Pdev_Reply;
  1013.  
  1014. typedef struct Pdev_NewReply {
  1015.     unsigned int magic;        /* == PDEV_REPLY_MAGIC */
  1016.     ReturnStatus status;    /* Return status of remote call */
  1017.     int        selectBits;    /* Return select state bits */
  1018. d171 2
  1019. a172 1
  1020. } Pdev_NewReply;
  1021. d174 1
  1022. a174 5
  1023. #define PDEV_REPLY_MAGIC    0x52455059
  1024. /*
  1025.  * For convenience to the Write reply, this reply struct
  1026.  * is defined for returning one int of reply data.
  1027.  */
  1028. a175 8
  1029. typedef struct Pdev_EasyReply {
  1030.     unsigned int magic;    /* == PDEV_REPLY_MAGIC */
  1031.     ReturnStatus status;
  1032.     int        selectBits;
  1033.     int        replySize;    /* please set to sizeof(int) !! */
  1034.     int        data;
  1035. } Pdev_EasyReply;
  1036.  
  1037. d194 1
  1038. a194 1
  1039.  *                that you read from the request stream.
  1040. d205 1
  1041. a205 1
  1042.  *                The input buffer contains a Pdev_NewReply.  This
  1043. d242 1
  1044. a258 1
  1045. #define PDEV_BUF_PTR_MAGIC_OLD    0x3C46DF15
  1046. @
  1047.